#include "include.h"

func_cb_t func_cb AT(.buf.func_cb);

AT(.text.func.bt)
void func_bt_init(void)
{
    if (!sys_cb.bt_is_inited) {
        msg_queue_clear();
        wireless_init();
        sys_cb.bt_is_inited = 1;
    }
}

//AT(.text.func.process)
//static void print_info(void)
//{
//    static u32 ticks = 0;
//    if (tick_check_expire(ticks,1000)) {
//        ticks = tick_get();
////        uart1_puts_cmd(0xAA);
////        printf("print_infn: %d %x\n",get_sysclk_nhz(),UART1CON);
//    }
//}

AT(.text.func.process)
void func_process(void)
{
    WDT_CLR();
//    print_info();
    bt_thread_check_trigger();
    if(sys_cb.pwroff_delay == 0) {
        sys_cb.pwrdwn_tone_en = 1;
        func_cb.sta = FUNC_PWROFF;
    }


#if VBAT_DETECT_EN
    u16 bat_off = LPWR_OFF_VBAT * 100 + 2700;
    if (bat_off > sys_cb.vbat) {
        sys_cb.pwrdwn_tone_en = 1;
        func_cb.sta = FUNC_PWROFF;
    }
#endif // VBAT_DETECT_EN

    //PWRKEY模拟硬开关关机处理
    if ((PWRKEY_2_HW_PWRON) && (sys_cb.pwrdwn_hw_flag)) {
        sys_cb.pwrdwn_tone_en = 1;
        func_cb.sta = FUNC_PWROFF;
        sys_cb.pwrdwn_hw_flag = 0;
    }

#if CHARGE_EN
    if (xcfg_cb.charge_en) {
        charge_detect(1);
        bsp_charge_inbox_process();
    }
#endif // CHARGE_EN

#if VUSB_SMART_VBAT_HOUSE_EN
    bsp_smart_vhouse_process(0);
#endif
    led_disp_proc();
}

//func common message process
AT(.text.func.msg)
void func_message(u16 msg)
{
    switch (msg) {

#if EQ_DBG_IN_UART
        case EVT_ONLINE_SET_EQ:
             bsp_eq_parse_cmd();
        break;
#if EFFECT_SET_IN_UART
   case EVT_ONLINE_SET_EFFECT:
        bsp_online_set_lemic_effect();
        break;
#endif
#endif

#if CHARGE_EN
        //耳机入仓关机
        case EVT_CHARGE_INBOX:
            break;
#endif // CHARGE_EN

        case EVT_CHARGE_DCIN:
            break;

        //长按PP/POWER软关机(通过PWROFF_PRESS_TIME控制长按时间)
        case KLH_POWER:
        case KLH_MODE_PWR:
        case KLH_PLAY_PWR_USER_DEF:
            if (!wireless_role_is_adapter()) {//发射端有效
                if(wireless_get_status()){
                    wireless_tx_user_discon_cmd();
                }
                sys_cb.pwrdwn_special_en = 1;//用来控制发射端软件关机流程下 断开链接后不进行广播
                msg_enqueue(EVT_WIRELESS_PWRDON_STA);
            }else{
                sys_cb.pwrdwn_tone_en = 1;
                func_cb.sta = FUNC_PWROFF;
            }

            break;
        case EVT_WIRELESS_PWRDON_STA:
            if (!wireless_role_is_adapter()) {//发射端有效
                sys_cb.pwrdwn_special_en = 1;//用来控制发射端软件关机流程下 断开链接后不进行广播
                //soft_pwronoff_enable(1);    //传参对应MIC NUM1
                //soft_pwronoff_enable(2);    //传参对应MIC NUM2
                le_mic_discon_by_mic_num(1);
                delay_5ms(40);
            }
            sys_cb.pwrdwn_tone_en = 1;
            func_cb.sta = FUNC_PWROFF;
            break;
    }

    //调节音量，3秒后写入flash
    if ((sys_cb.cm_vol_change) && (sys_cb.cm_times >= 6)) {
        sys_cb.cm_vol_change = 0;
        cm_sync();
    }
}

///进入一个功能的总入口
AT(.text.func)
void func_enter(void)
{
    gui_box_clear();
    param_sync();
    reset_sleep_delay();
    reset_pwroff_delay();
    func_cb.mp3_res_play = NULL;
    func_cb.set_vol_callback = NULL;
    bsp_clr_mute_sta();
    sys_cb.voice_evt_brk_en = 1;    //播放提示音时，快速响应事件。
}

AT(.text.func)
void func_exit(void)
{
    u8 func_num;
    u8 funcs_total = get_funcs_total();

    for (func_num = 0; func_num != funcs_total; func_num++) {
        if (func_cb.last == func_sort_table[func_num]) {
            break;
        }
    }
    func_num++;                                     //切换到下一个任务
    if (func_num >= funcs_total) {
        func_num = 0;
    }
    func_cb.sta = func_sort_table[func_num];        //新的任务
#if SYS_MODE_BREAKPOINT_EN
    param_sys_mode_write(func_cb.sta);
#endif // SYS_MODE_BREAKPOINT_EN
}

AT(.text.func)
void func_run(void)
{
    printf("%s\n", __func__);

    //func_bt_chk_off();
    if (wireless_role_is_adapter()) {
        func_cb.sta = FUNC_ADAPTER;
    } else {
        func_cb.sta = FUNC_DEVICE;
    }
    while (1) {
        func_enter();
        switch (func_cb.sta) {
        case FUNC_PWROFF:
            func_pwroff(sys_cb.pwrdwn_tone_en);
            break;

        case FUNC_SLEEPMODE:
            func_sleepmode();
            break;

        case FUNC_DEVICE:
            func_device();
            break;

        case FUNC_ADAPTER:
            func_adapter();
            break;

        case FUNC_LE_DUT:
            func_le_dut();
            break;

        case FUNC_OTA_MANU:
            func_ota_manu();
            break;

        default:
            func_exit();
            break;
        }
    }
}
